package com.chuanyun.wechatcheckin.model.wechat;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;

/**
 * 企业微信获取打卡日报数据响应
 */
@Data
public class CheckinDayDataResponse {
    
    /**
     * 错误码，0表示成功
     */
    @JsonProperty("errcode")
    private Integer errCode;
    
    /**
     * 错误信息
     */
    @JsonProperty("errmsg")
    private String errMsg;
    
    /**
     * 打卡日报数据列表
     */
    @JsonProperty("datas")
    private List<DayData> datas;
    
    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return errCode != null && errCode == 0;
    }
    
    /**
     * 打卡日报数据
     */
    @Data
    public static class DayData {
        
        /**
         * 基础信息
         */
        @JsonProperty("base_info")
        private BaseInfo baseInfo;
        
        /**
         * 汇总信息
         */
        @JsonProperty("summary_info")
        private SummaryInfo summaryInfo;
        
        /**
         * 假期信息
         */
        @JsonProperty("holiday_infos")
        private List<HolidayInfo> holidayInfos;
        
        /**
         * 异常信息
         */
        @JsonProperty("exception_infos")
        private List<ExceptionInfo> exceptionInfos;
        
        /**
         * 加班信息
         */
        @JsonProperty("ot_info")
        private OtInfo otInfo;
        
        /**
         * 审批信息
         */
        @JsonProperty("sp_items")
        private List<SpItem> spItems;
    }
    
    /**
     * 基础信息
     */
    @Data
    public static class BaseInfo {
        
        /**
         * 日期（Unix时间戳）
         */
        @JsonProperty("date")
        private Long date;
        
        /**
         * 记录类型：1-固定上下班；2-外出；3-按班次上下班；4-自由签到；5-加班；7-无规则
         */
        @JsonProperty("record_type")
        private Integer recordType;
        
        /**
         * 打卡人员姓名
         */
        @JsonProperty("name")
        private String name;
        
        /**
         * 打卡人员别名
         */
        @JsonProperty("name_ex")
        private String nameEx;
        
        /**
         * 打卡人员所在部门，会显示所有所在部门
         */
        @JsonProperty("departs_name")
        private String departsName;
        
        /**
         * 打卡人员账号，即userid
         */
        @JsonProperty("acctid")
        private String acctId;
        
        /**
         * 打卡人员所属规则信息
         */
        @JsonProperty("rule_info")
        private RuleInfo ruleInfo;
        
        /**
         * 日报类型：0-工作日日报；1-休息日日报
         */
        @JsonProperty("day_type")
        private Integer dayType;
    }
    
    /**
     * 打卡规则信息
     */
    @Data
    public static class RuleInfo {
        
        /**
         * 所属规则的id
         */
        @JsonProperty("groupid")
        private Integer groupId;
        
        /**
         * 打卡规则名
         */
        @JsonProperty("groupname")
        private String groupName;
        
        /**
         * 当日所属班次id，仅按班次上下班才有值
         */
        @JsonProperty("scheduleid")
        private Integer scheduleId;
        
        /**
         * 当日所属班次名称，仅按班次上下班才有值
         */
        @JsonProperty("schedulename")
        private String scheduleName;
        
        /**
         * 当日打卡时间，仅固定上下班规则有值
         */
        @JsonProperty("checkintime")
        private List<CheckinTime> checkinTime;
    }
    
    /**
     * 打卡时间
     */
    @Data
    public static class CheckinTime {
        
        /**
         * 上班时间，为距离0点的时间差
         */
        @JsonProperty("work_sec")
        private Long workSec;
        
        /**
         * 下班时间，为距离0点的时间差
         */
        @JsonProperty("off_work_sec")
        private Long offWorkSec;
        
        /**
         * 休息时间段列表（API实际响应中包含但文档未记录的字段）
         */
        @JsonProperty("rest_times")
        private List<RestTime> restTimes;
    }
    
    /**
     * 休息时间段
     */
    @Data
    public static class RestTime {
        
        /**
         * 休息开始时间，为距离0点的时间差
         */
        @JsonProperty("rest_begin_time")
        private Long restBeginTime;
        
        /**
         * 休息结束时间，为距离0点的时间差
         */
        @JsonProperty("rest_end_time")
        private Long restEndTime;
    }
    
    /**
     * 汇总信息
     */
    @Data
    public static class SummaryInfo {
        
        /**
         * 当日打卡次数
         */
        @JsonProperty("checkin_count")
        private Integer checkinCount;
        
        /**
         * 工作时长（秒）
         */
        @JsonProperty("regular_work_sec")
        private Integer regularWorkSec;
        
        /**
         * 标准工作时长（秒）
         */
        @JsonProperty("standard_work_sec")
        private Integer standardWorkSec;
        
        /**
         * 最早打卡时间（Unix时间戳）
         */
        @JsonProperty("earliest_time")
        private Long earliestTime;
        
        /**
         * 最晚打卡时间（Unix时间戳）
         */
        @JsonProperty("lastest_time")
        private Long lastestTime;
    }
    
    /**
     * 假期信息
     */
    @Data
    public static class HolidayInfo {
        
        /**
         * 假勤申请id，即当日关联的假勤审批单id
         */
        @JsonProperty("sp_number")
        private String spNumber;
        
        /**
         * 假勤信息摘要-标题信息
         */
        @JsonProperty("sp_title")
        private SpTitle spTitle;
        
        /**
         * 假勤信息摘要-描述信息
         */
        @JsonProperty("sp_description")
        private SpDescription spDescription;
    }
    
    /**
     * 假勤信息摘要-标题信息
     */
    @Data
    public static class SpTitle {
        
        /**
         * 多种语言描述，目前只有中文一种
         */
        @JsonProperty("data")
        private List<SpTitleData> data;
    }
    
    /**
     * 标题数据
     */
    @Data
    public static class SpTitleData {
        
        /**
         * 假勤信息摘要-标题文本
         */
        @JsonProperty("text")
        private String text;
        
        /**
         * 语言类型："zh_CN"
         */
        @JsonProperty("lang")
        private String lang;
    }
    
    /**
     * 假勤信息摘要-描述信息
     */
    @Data
    public static class SpDescription {
        
        /**
         * 多种语言描述，目前只有中文一种
         */
        @JsonProperty("data")
        private List<SpDescriptionData> data;
    }
    
    /**
     * 描述数据
     */
    @Data
    public static class SpDescriptionData {
        
        /**
         * 假勤信息摘要-描述文本
         */
        @JsonProperty("text")
        private String text;
        
        /**
         * 语言类型："zh_CN"
         */
        @JsonProperty("lang")
        private String lang;
    }
    
    /**
     * 异常信息
     */
    @Data
    public static class ExceptionInfo {
        
        /**
         * 异常类型
         */
        @JsonProperty("exception")
        private String exception;
        
        /**
         * 异常次数
         */
        @JsonProperty("count")
        private Integer count;
        
        /**
         * 异常时长（秒）
         */
        @JsonProperty("duration")
        private Integer duration;
    }
    
    /**
     * 加班信息
     */
    @Data
    public static class OtInfo {
        
        /**
         * 状态：0-无加班；1-正常；2-缺时长
         */
        @JsonProperty("ot_status")
        private Integer otStatus;
        
        /**
         * 加班时长
         */
        @JsonProperty("ot_duration")
        private Integer otDuration;
        
        /**
         * ot_status为2下，加班不足的时长
         */
        @JsonProperty("exception_duration")
        private List<Integer> exceptionDuration;
        
        /**
         * 工作日加班记为调休，单位秒
         */
        @JsonProperty("workday_over_as_vacation")
        private Integer workdayOverAsVacation;
        
        /**
         * 工作日加班记为加班费，单位秒
         */
        @JsonProperty("workday_over_as_money")
        private Integer workdayOverAsMoney;
        
        /**
         * 休息日加班记为调休，单位秒
         */
        @JsonProperty("restday_over_as_vacation")
        private Integer restdayOverAsVacation;
        
        /**
         * 休息日加班记为加班费，单位秒
         */
        @JsonProperty("restday_over_as_money")
        private Integer restdayOverAsMoney;
        
        /**
         * 节假日加班记为调休，单位秒
         */
        @JsonProperty("holiday_over_as_vacation")
        private Integer holidayOverAsVacation;
        
        /**
         * 节假日加班记为加班费，单位秒
         */
        @JsonProperty("holiday_over_as_money")
        private Integer holidayOverAsMoney;
    }
    
    /**
     * 加班规则
     */
    @Data
    public static class OtRule {
        
        /**
         * 加班开始时间（Unix时间戳）
         */
        @JsonProperty("ot_start_time")
        private Long otStartTime;
        
        /**
         * 加班结束时间（Unix时间戳）
         */
        @JsonProperty("ot_end_time")
        private Long otEndTime;
        
        /**
         * 加班时长（秒）
         */
        @JsonProperty("ot_duration")
        private Integer otDuration;
    }
    
    /**
     * 假勤统计信息
     */
    @Data
    public static class SpItem {
        
        /**
         * 类型：1-请假；2-补卡；3-出差；4-外出；15-审批打卡；100-外勤
         */
        @JsonProperty("type")
        private Integer type;
        
        /**
         * 具体请假类型，当type为1请假时，具体的请假类型id，可通过审批相关接口获取假期详情
         */
        @JsonProperty("vacation_id")
        private Integer vacationId;
        
        /**
         * 当日假勤次数
         */
        @JsonProperty("count")
        private Integer count;
        
        /**
         * 当日假勤时长秒数，时长单位为天直接除以86400即为天数，单位为小时直接除以3600即为小时数
         */
        @JsonProperty("duration")
        private Integer duration;
        
        /**
         * 时长单位：0-按天 1-按小时
         */
        @JsonProperty("time_type")
        private Integer timeType;
        
        /**
         * 统计项名称
         */
        @JsonProperty("name")
        private String name;
    }
}